/*
 * GeneradorPunteros.h
 *
 *  Created on: 22/11/2011
 *      Author: putaro
 */

#include <iostream>
#include <string>
#include <stdlib.h>
#include <fstream>

using namespace std;

#ifndef GENERADORPUNTEROS_H_
#define GENERADORPUNTEROS_H_
#define NOMBRE_ARCHIVO_PUNTEROS "Punteros.bin"
/*
 * Una instancia de esta clase permite generador un archivo de punteros y frecuencias. Dichos punteros
 * son codificados mediante codigos Delta.
 */
class GeneradorPunteros {
public:

	unsigned int numeroDeBit; //indica el número de bit en el que se grabo el último dato
							// en el archivo de salida

	unsigned int bufferEscritura; //permite almacenar una cadena de bits hasta completar
								//su máxima capacidad para luego grabar en archivo

	unsigned int contadorBufferEscritura; //cuenta la cantidad de bits ocupados del
										//buffer de escritura.

	ofstream archivoPunteros; // archivo de salida

public:

	/*
	 * Pre: El parámetro es la ruta del directorio donde se guardará al archivo de punteros.
	 * Post: Se crea la instancia creando el archivo asociado.
	 */
	GeneradorPunteros(const string &rutaDirectorioDestino);

	/*
	 * Pre: La instancia ha sido creada.
	 * Post: Se ha destruido la instancia cerrando archivos y grabando el resto de los
	 * bits contenidos en el buffer antes de cerrar.
	 */
	virtual ~GeneradorPunteros();

	/*
	 * Post: La instancia ha sido creada y los parámetros son valores no negativos.
	 * Post: Se graba en el archivo el par frecuencia - puntero dado por parámetro
	 * codificado.
	 * Returns: Offset al bit dónde se guardo el par.
	 */
	unsigned int guardarPunteroFrecuencia(const unsigned int puntero ,
							const unsigned int frecuencia );

	/*
	 * Pre: La instancia ha sido creada y el parámetro es 0 o 1.
	 * Post: Se ha guardado en el archivo asociado el bit dado por el parámetro.
	 */
	void guardarBit(const unsigned int valor);

private:

	/*
	 * Pre: La instancia ha sido creada, y el entero pasado por parámetro es positivo.
	 * Post: Se ha guardado el entero pasado por parámetro en el archivo asociado a la
	 * instancia.
	 */
	void guardarEntero(const unsigned int valor);

	/*
	 * Pre: La instancia ha sido creada.
	 * Post: Se ha cerrado el archivo correctamente grabando el resto del contenido del buffer
	 * y completando el buffer si fuese necesario.
	 */
	void cerrarArchivo();
};

#endif /* GENERADORPUNTEROS_H_ */
